package sanrenxing.dayEnd.backRepertoryTotal.controller;

import com.google.inject.internal.util.$Preconditions;
import jdk.nashorn.internal.ir.IfNode;
import org.apache.shiro.web.session.HttpServletSession;
import org.omg.CORBA.StringHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import sanrenxing.dayEnd.backRepertoryTotal.dao.FundAllocationDao;
import sanrenxing.dayEnd.backRepertoryTotal.dao.TabaseDao;
import sanrenxing.dayEnd.backRepertoryTotal.domain.FundAllocation;
import sanrenxing.dayEnd.backRepertoryTotal.domain.Tabase;
import sanrenxing.dayEnd.backRepertoryTotal.domain.TabaseT;
import sanrenxing.dayEnd.backRepertoryTotal.service.TabaseService;
import sanrenxing.dayEnd.backRepertoryTotal.utils.ExclUtils;


import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Date;

/**
 * Description:
 * date：2021/3/12 0012 上午 9:04
 * @auther ${梁树仁}
 * @version：
 * @since JDK 1.8
 **/
@Controller
@RequestMapping("/tabasecrud")
public class TabaseController {
    //注入
    @Autowired
    private TabaseService tabaseService;

    //为获得基金名称和现金账户名称的dao对象
    @Autowired
    private FundAllocationDao fundAllocationDao;

    ///method
    /**
     * 分页查询
     * @param req 请求对象
     * @param page 页数
     * @param limit 行数
     * @return 返回map集合从后端填充数据到前端
     */
    @GetMapping("/method")
    @ResponseBody
    //Map<String,Object> selectTabase(HttpSer request,page,limit)
    public Map<String,Object> selectTabase( HttpServletRequest req,int page, int limit){
        //定义用于构造多条件查询的交易数据tabase对象
        Tabase tabase= new Tabase();
        //获取来自请求中的交易日期
        String dates=req.getParameter("dates");
        //日期不为空和去空格长度不为0
        if(dates!=null&&dates.trim().length()!=0){
            //定义一个日期格式
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
            //把日期字符串转换为日期对象
            try {
                //设置dates为获取parse的日期
                tabase.setDates(sdf.parse(dates));
            }catch (ParseException e){
                //打印异常
                e.printStackTrace();
            }
        }

        /*Sdatesreq.getParameter("dates");
        (!=null&& .trim().length()!)
          tabase.setDates(sdf.parse(dates));
           (ParseException e) {e.printStackTrace();}*/

        //获取来自请求中的交易类型
        String tranType=req.getParameter("tranType");
        if (tranType!=null&&tranType.trim().length()!=0) {
            tabase.setTranType(Integer.parseInt(tranType));
        }
        //调用数据方法，根据员工对象构造查询条件字符串
        Map<String,Object> map=new HashMap<String,Object>();
        //定义condition
        String condition=tabaseService.getCondition(tabase);
        //在映射集合中添加key为code，值为0的状态码
        map.put("code",0);
        //在映射集合中添加key为msg，值为响应信息字符串
        map.put("msg","");
        //在映射集合中添加key为count，值为condition总数量的数据对
        map.put("count",tabaseService.count(condition));
        //在映射集合中添加key为date，值为查询成员集合对象
        map.put("data",tabaseService.findByPage(limit,page,condition));
        //在映射集合中添加key为queryFundSetpT，值为dao接口调用queryFundSetpT方法
        map.put("queryFundSetpT",fundAllocationDao.queryFundSetpT());
        //在映射集合中添加key为queryCashAccountT，值为dao接口调用queryCashAccountT方法
        map.put("queryCashAccountT",fundAllocationDao.queryCashAccountT());
        //在映射集合中添加key为setting，值为querySet查询
        map.put("setting",tabaseService.querySet());
        return map;

    }

    /**
     * 新增方法
     * @param tabase
     * @return 0,failure 1，SUCCESS
     */
    @PostMapping("/method")
    @ResponseBody
    public String add(@RequestBody TabaseT tabase){
        //计算出总金额：（数量*单价）+（数量*费率 0.004）
        //计算实际金额
        double Money=(tabase.getNumbers()*tabase.getPrice());
        //计算费用*0.0025
        double cost=(tabase.getNumbers()*0.0025);
        //添加设置expense费用
        tabase.setExpenses(cost);

        //申购
        if (tabase.getTranType()==2){
            //添加总金额
            tabase.setSumMoney(Money);
            //添加实际金额
            tabase.setActMoney(Money+cost);
        }else if (tabase.getTranType()==1){//认购
            //添加总金额
            tabase.setSumMoney(Money);
            //添加费用
            tabase.setExpenses(0);
            //添加实际金额
            tabase.setActMoney(Money);
        }else if (tabase.getTranType()==3){//赎回
            //添加总金额
            tabase.setSumMoney(Money);
            //添加实际金额
            tabase.setActMoney(Money-cost);
        }
        //返回增加行数，判断是否成功
        return tabaseService.add(tabase)>0?"success":"fail";

    }

    /**
     * 删除方法
     * @param
     * @return 0,failure 1，SUCCESS
     */
    @DeleteMapping("/method/{dataId}")
    @ResponseBody
    public String delete(@PathVariable int dataId){
        //删除带dataId的行数，判断是否成功
        return tabaseService.delete(dataId)>0?"success":"fail";
    }

    /**
     * 修改方法方法
     * @param
     * @return 0,failure 1，SUCCESS
     */
    @PutMapping("/method")
    @ResponseBody
    public String update(@RequestBody Tabase tabase){
        //计算出总金额：（数量*单价）+（数量*费率 0.004）
        //计算实际金额
        double  Money=(tabase.getNumbers()*tabase.getPrice());
        //计算费用
        double cost=(tabase.getNumbers()*0.0025);
        //添加费用
        tabase.setExpenses(cost);

        //申购
        if (tabase.getTranType()==2){
            //添加总金额
            tabase.setSumMoney(Money);
            //添加实际金额
            tabase.setActMoney(Money+cost);
        }else if (tabase.getTranType()==1){//认购
            //添加总金额
            tabase.setSumMoney(Money);
            //添加费用
            tabase.setExpenses(0);
            //添加实际金额
            tabase.setActMoney(Money);
        }else if (tabase.getTranType()==3){//赎回
            //添加总金额
            tabase.setSumMoney(Money);
            //添加实际金额(Money-cost);
            tabase.setActMoney(Money-cost);
        }
        //返回update行数
        int rows=tabaseService.update(tabase);
        //判断是否成功
        return rows>0?"success":"fail";

    }


    /**
     * 批量删除
     * @param
     * @return 0,failure 1，SUCCESS
     */
    @PutMapping("/batchDel")
    @ResponseBody
    //batchDelById根据id批量删，带过来dataIdStr参数
    public String batchDelById(@RequestParam String dataIdStr){
        //对编号字符串按","分割
        String[] dataIds=dataIdStr.split(",");
        //定义返回值为删除成功
        String result="batch delete success";
        //循环删除
        for(String str:dataIds){
            //转换类型
            int dataId=Integer.parseInt(str);
            //调用业务层删除记录
            int rows=tabaseService.delete(dataId);
            //判断rows
            if(rows<=0){
                //否则结果为删除失败
                result="batch delete failure";
                //退出
                break;
            }
        }
        //返回结果
        return result;
    }


    @RequestMapping("/form")
    public String form(HttpServletRequest request)throws Exception{
        //创建MultipartHttpServletRequest  spring文件对象等于request
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

        //定义输出流对象
        InputStream in =null;
        //创建一个list集合嵌套list集合对象
        List<List<Object>> listob = null;
        //用multipartfile创建上传文件对象获取getfile,upfile上传对象
        MultipartFile file =multipartRequest.getFile("upfile");

        //判断文件isempty(是否存在)
        if(file.isEmpty()){
            //抛出异常提示的信息
            throw new Exception("文件不存在！");
        }
        //实例化输入流对象
        in = file.getInputStream();
        //用excl工具类.创建一个对象（流和对象）的方式存储excl表数据
        listob =new ExclUtils().getBankListByExcel(in,file.getOriginalFilename());
        //newExclUtils()get(in得到源文件)
        //关闭流
        in.close();

        //创建一个日期转换格式为yyyy-mm-dd
        SimpleDateFormat Sdf=new SimpleDateFormat("yyyy-MM-dd");
        //该处可调用service相应方法进行数据保存到数据库中，现只对数据输出
        //循环遍历输出excl数据内容
        for (int i = 0; i < listob.size(); i++) {
            //用集合定义一个接收数据的对象
            List<Object> lo = listob.get(i);
            //副表创建对象
            TabaseT tabase = new TabaseT();
            //交易id，int
            //tabase.setDataId(Integer.valueOf(lo.get(0).toString()));
            tabase.setDataId((int)Double.parseDouble(lo.get(0).toString()));
            //基金id,String
            tabase.setFundId(String.valueOf(lo.get(1)));
            //现金id,int
            tabase.setCaId((int)Double.parseDouble(lo.get(2).toString()));
            //交易日期,String
            tabase.setDates(lo.get(3).toString());
            //数量,int
            tabase.setNumbers((int)Double.parseDouble(lo.get(4).toString()));
            //结算日期,String
            tabase.setEndDate(lo.get(5).toString());
            //（3个）总金额，实际金额，单价，费用，double
            tabase.setSumMoney(Double.valueOf(lo.get(6).toString()));
            tabase.setActMoney(Double.valueOf(lo.get(7).toString()));
            String l=lo.get(8).toString();
            Double price=Double.valueOf(l);
            tabase.setPrice(price);
            tabase.setExpenses(Double.valueOf(lo.get(9).toString()));
            //代销机构(String)
            tabase.setConagen(String.valueOf(lo.get(10)));
            //（2个）交易类型，交易状态(int)
            tabase.setTranType((int)Double.parseDouble(lo.get(11).toString()));
            tabase.setTranStatus((int)Double.parseDouble(lo.get(12).toString()));

            //计算出总金额：（数量*单价）+（数量*费率 0.004）
            //计算实际金额
            double Money=(tabase.getNumbers()*tabase.getPrice());
            //计算费用*0.04
            double cost=(tabase.getNumbers()*0.004);
            //添加费用
            tabase.setExpenses(cost);

            //申购
            if (tabase.getTranType()==2){
                //添加总金额
                tabase.setSumMoney(Money+cost);
                //添加实际金额
                tabase.setActMoney(Money);
            }else if (tabase.getTranType()==1){//认购
                //添加总金额
                tabase.setSumMoney(Money);
                //添加费用
                tabase.setExpenses(0);
                //添加实际金额
                tabase.setActMoney(Money);
            }else if (tabase.getTranType()==3){//赎回
                //添加总金额
                tabase.setSumMoney(Money);
                //添加实际金额
                tabase.setActMoney(Money-cost);
            }
            //添加到数据表
            tabaseService.add(tabase);
        }
        //base返回
        return "redirect:/html/Tabase.html";
    }
}


